﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data;
using Crosland.Automotriz.Logic.Linq;
using System.Net.Mail;
using Crosland.Automotriz.Facade.Facade;
using Crosland.Automotriz.Facade.Interface;
using Crosland.Automotriz.Entidad;
using System.Configuration;
using DevExpress.Web.ASPxEditors;
using Crosland.Automotriz.Seguridad.Entity;
using Crosland.Automotriz.Seguridad.DataAccess;
using Crosland.Automotriz.Seguridad.Business;
using DevExpress.Web.ASPxGridView;
using Crosland.Automotriz.Logic;

namespace Crosland.Automotriz.Web.Vehiculos
{
    public partial class wFrmCompensacionVehiculo : BaseForm
    {
        string idNegocio = ConfigurationManager.AppSettings["Negocio"];

        iFacadeCompensacionVehiculo BL_CompensacionVehiculo = new FacadeCompensacionVehiculo();
        clsUsuarioLogic usu = new clsUsuarioLogic();
        clsT_Mae_Tabla_General_DetLogic TablaDetLogic = new clsT_Mae_Tabla_General_DetLogic();

        protected override void Inicializar()
        {
            ddlAnio.Value = DateTime.Today.Year;
            ddlMes.SelectedIndex = DateTime.Today.Month - 1;
            //ddlUsuario.Items.Insert(0, new ListEditItem("-Seleccione-", ""));
            CargarMonedas();
            CargarUsuarios();
            Consultar();
            CrearTablaDepositos();
            //UsuariosCorreo();
        }

        protected void btnNuevo_Click(object sender, EventArgs e)
        {
            Response.Redirect("/Vehiculos/wFrmCompensacionVehiculoNuevo.aspx?id=3&sub=35");
        }

        protected void CargarMonedas()
        {
            ddlMoneda.DataSource = BL_CompensacionVehiculo.ListarMonedas();
            ddlMoneda.DataBind();
            ddlMoneda.Items.Insert(0, new ListEditItem("-Todos-", 0));
            ddlMoneda.Items[0].Selected = true;

        }

        protected void CargarUsuarios()
        {
            T_SEG_USUARIO usuario = usu.listarUser(Session[DatosSesion.User].ToString())[0];

            ddlUsuario.DataSource = BL_CompensacionVehiculo.ListarUsuariosFacturadores();
            ddlUsuario.TextField = "USUARIO";
            ddlUsuario.DataBind();
            ddlUsuario.Items.Insert(0, new ListEditItem("-Todos-", "0"));
            ddlUsuario.Value = usuario.ID_USUARIO;
        }

        protected void Consultar()
        {
            try
            {
                int anio = Convert.ToInt32(ddlAnio.Value);
                int mes = Convert.ToInt32(ddlMes.Value);
                string usuario = ddlUsuario.Value.ToString();
                int moneda = Convert.ToInt32(ddlMoneda.Value);
                int estado = Convert.ToInt32(ddlEstado.Value);

                grdDepositos.DataSource = BL_CompensacionVehiculo.BuscarDepositos(anio, mes, usuario, moneda, estado);
                grdDepositos.DataBind();
            }
            catch (Exception ex)
            {
                GuardarExceptionLog(ex.Message, ex, "Consultar");
                MensajesError(ex.Message, ex, "Consultar");
            }

        }

        protected void btnConsultar_Click(object sender, EventArgs e)
        {
            Consultar();
        }

        protected void grdDepositos_PageIndexChanged(object sender, EventArgs e)
        {
            Consultar();
        }

        protected void btnCompensar_Click(object sender, EventArgs e)
        {
            List<int> depositos = SeleccionarDepositos();
            if (depositos.Count > 0)
            {

                Session["ListaDepositos"] = depositos;

                Response.Redirect("/Vehiculos/wFrmCompensacionVehiculoAsociar.aspx?id=3&sub=35");
            }
            else
            {
                string script = "ShowValidacionSeleccion();";
                ScriptManager.RegisterStartupScript(this, typeof(Page), "carga", script, true);
            }


        }

        protected void grdDepositos_PreRender(object sender, EventArgs e)
        {
            Consultar();
        }

        protected List<int> SeleccionarDepositos()
        {
            CrearTablaDepositos();

            DataTable dt = new DataTable();
            dt = (DataTable)Session["TablaCompensacion"];
            DataRow dr;

            List<int> depositos = new List<int>();
            List<int> cliente = new List<int>();
            List<decimal> sinSaldo = new List<decimal>();

            for (int i = 0; i < grdDepositos.VisibleRowCount; i++)
            {
                if (grdDepositos.Selection.IsRowSelected(i))
                {
                    int idCliente = Convert.ToInt32(grdDepositos.GetRowValues(i, "ID_CLIENTE"));
                    cliente.Add(idCliente);
                }
            }

            for (int i = 0; i < grdDepositos.VisibleRowCount; i++)
            {
                if (grdDepositos.Selection.IsRowSelected(i))
                {
                    decimal Saldo = Convert.ToInt32(grdDepositos.GetRowValues(i, "SaldoDepositoSoles"));
                    sinSaldo.Add(Saldo);
                }
            }

            if (sinSaldo.Sum() == 0)
            {
                lblValidacion.Text = "Debe seleccionar depositos con saldo mayor a 0.";
                string script = "ShowValidacion();";
                ScriptManager.RegisterStartupScript(this, typeof(Page), "carga", script, true);
            }
            else
            {
                if (cliente.Distinct().Count() > 1)
                {
                    lblValidacion.Text = "Debe seleccionar depositos del mismo cliente.";
                    string script = "ShowValidacion();";
                    ScriptManager.RegisterStartupScript(this, typeof(Page), "carga", script, true);
                }
                else
                {
                    for (int i = 0; i < grdDepositos.VisibleRowCount; i++)
                    {

                        if (grdDepositos.Selection.IsRowSelected(i))
                        {
                            Int32 id = Convert.ToInt32(grdDepositos.GetRowValues(i, "ID_OPERACION_CAJA"));

                            dr = dt.NewRow();
                            dr.BeginEdit();
                            dr["ID"] = dt.Rows.Count + 1;
                            dr["IdClaseFactura"] = grdDepositos.GetRowValues(i, "ID_TIPO_DOCUMENTO");
                            dr["DesClaseFactura"] = grdDepositos.GetRowValues(i, "DES_CLASE_FACTURA");
                            dr["IdCuenta"] = "12201010";
                            dr["CtaCorriente"] = grdDepositos.GetRowValues(i, "NRO_CUENTA_CORRIENTE");
                            dr["IdMoneda"] = grdDepositos.GetRowValues(i, "ID_MONEDA");
                            dr["Moneda"] = grdDepositos.GetRowValues(i, "NOM_MONEDA");
                            dr["DebeSoles"] = Convert.ToDecimal(grdDepositos.GetRowValues(i, "SaldoDepositoSoles"));
                            dr["HaberSoles"] = 0;
                            dr["DebeDolar"] = Convert.ToDecimal(grdDepositos.GetRowValues(i, "SaldoDepositoDolar"));
                            dr["HaberDolar"] = 0;

                            if (Convert.ToInt32(grdDepositos.GetRowValues(i, "ID_MONEDA")) == 1)
                            {
                                dr["ImpAplicar"] = Convert.ToDecimal(grdDepositos.GetRowValues(i, "SaldoDepositoSoles"));
                            }
                            else if (Convert.ToInt32(grdDepositos.GetRowValues(i, "ID_MONEDA")) == 2)
                            {
                                dr["ImpAplicar"] = Convert.ToDecimal(grdDepositos.GetRowValues(i, "SaldoDepositoDolar"));
                            }

                            dr["TipoCambio"] = Convert.ToDecimal(grdDepositos.GetRowValues(i, "IMP_TIPO_CAMBIO"));
                            dr["FechaOperacion"] = Convert.ToDateTime(grdDepositos.GetRowValues(i, "FEC_OPERACION")).ToShortDateString();
                            dr["NroOperacion"] = grdDepositos.GetRowValues(i, "ID_OPERACION_CAJA");
                            dr["NroDocumento"] = grdDepositos.GetRowValues(i, "NUM_OPERACION");
                            dr.EndEdit();
                            dt.Rows.Add(dr);


                            depositos.Add(id);
                        }

                    }

                    Session["TablaCompensacion"] = dt;

                }
            }

            return depositos;
        }

        protected void CrearTablaDepositos()
        {
            Session["TablaCompensacion"] = null;
            DataTable dt = new DataTable();

            if (Session["TablaCompensacion"] == null)
            {
                dt.PrimaryKey = new DataColumn[] { dt.Columns.Add("ID", typeof(string)) };
                dt.Columns.Add("IdClaseFactura", System.Type.GetType("System.String"));
                dt.Columns.Add("DesClaseFactura", System.Type.GetType("System.String"));
                dt.Columns.Add("IdCuenta", System.Type.GetType("System.String"));
                dt.Columns.Add("CtaCorriente", System.Type.GetType("System.String"));
                dt.Columns.Add("IdMoneda", System.Type.GetType("System.String"));
                dt.Columns.Add("Moneda", System.Type.GetType("System.String"));
                dt.Columns.Add("DebeSoles", System.Type.GetType("System.Decimal"));
                dt.Columns.Add("HaberSoles", System.Type.GetType("System.Decimal"));
                dt.Columns.Add("DebeDolar", System.Type.GetType("System.Decimal"));
                dt.Columns.Add("HaberDolar", System.Type.GetType("System.Decimal"));
                dt.Columns.Add("TipoCambio", System.Type.GetType("System.Decimal"));
                dt.Columns.Add("ImpAplicar", System.Type.GetType("System.Decimal"));
                dt.Columns.Add("FechaOperacion", System.Type.GetType("System.String"));
                dt.Columns.Add("NroOperacion", System.Type.GetType("System.String"));
                dt.Columns.Add("NroDocumento", System.Type.GetType("System.String"));

                Session["TablaCompensacion"] = dt;

            }
            else
            {
                dt = (DataTable)Session["TablaCompensacion"];

            }


        }

        protected void grdDepositos_RowCommand(object sender, DevExpress.Web.ASPxGridView.ASPxGridViewRowCommandEventArgs e)
        {
            int id = Convert.ToInt32(e.CommandArgs.CommandArgument);
            Session["ID_DEPOSITO"] = id;

            if (e.CommandArgs.CommandName == "Detalle")
            {
      

                List<TD_OPERACION_DEPOSITO_MAE> Lista = BL_CompensacionVehiculo.ListarDatosOperacionMae(id);

                grdMaestroOperacion.DataSource = Lista;
                grdMaestroOperacion.DataBind();

                string script = "ShowMaestroDetalle();";
                ScriptManager.RegisterStartupScript(this, typeof(Page), "carga", script, true);

            }

        }

        protected void btnSalir_Click(object sender, EventArgs e)
        {
            Session["ListaDepositos"] = null;
            //Session["TablaDepositos"] = null;
            Session["FechaCompensacion"] = null;
            Session["TablaCompensacion"] = null;
            Response.Redirect("~/Repuestos/wFrmDefault.aspx?id=" + idNegocio);
        }

        protected void grdDetalleOperacion_BeforePerformDataSelect(object sender, EventArgs e)
        {
            Session["ID_OPERACION"] = (sender as ASPxGridView).GetMasterRowKeyValue();

        }

        protected void grdMaestroOperacion_RowCommand(object sender, ASPxGridViewRowCommandEventArgs e)
        {
            int id = Convert.ToInt32(e.CommandArgs.CommandArgument);

            if (e.CommandArgs.CommandName == "Extornar")
            {

                bool flag = BL_CompensacionVehiculo.ExtornarOperacion(id);

                if (flag == true)
                {
                    int idD = Convert.ToInt32(Session["ID_DEPOSITO"]);
                    List<TD_OPERACION_DEPOSITO_MAE> Lista = BL_CompensacionVehiculo.ListarDatosOperacionMae(idD);

                    grdMaestroOperacion.DataSource = Lista;
                    grdMaestroOperacion.DataBind();

                    //Envia correo cuando se extorna una compensacion
                    List<TD_Facturas_Compensadas> ListaExtorno = BL_CompensacionVehiculo.FacturasExtornadas(id);

                    if (ListaExtorno.Count > 0)
                    {
                        EnviarCorreo(id);
                    }

                    string script = "Extorno();";
                    ScriptManager.RegisterStartupScript(this, typeof(Page), "carga", script, true);
                }
                else
                {
                    string script = "ShowErrorExtorno();";
                    ScriptManager.RegisterStartupScript(this, typeof(Page), "carga", script, true);
                }


            }
        }

        protected void grdMaestroOperacion_HtmlRowCreated(object sender, ASPxGridViewTableRowEventArgs e)
        {
            if (e.RowType != DevExpress.Web.ASPxGridView.GridViewRowType.Data) return;

            int Indicador = Convert.ToInt32(e.GetValue("IND_EXTORNO"));
            Label lbl = grdMaestroOperacion.FindRowCellTemplateControl(e.VisibleIndex, null, "IND_EXTORNO") as Label;

            ImageButton img = grdMaestroOperacion.FindRowCellTemplateControl(e.VisibleIndex, null, "btnDetalle") as ImageButton;

            if (Indicador == 0)
            {
                img.Visible = true;
            }
            else
            {
                img.Visible = false;
            }


            img.Attributes.Add(JavaScript.EventoClick, JavaScript.ConfirmExtorno);

        }

        protected void grdMaestroOperacion_HtmlRowPrepared(object sender, ASPxGridViewTableRowEventArgs e)
        {
            if (e.RowType != GridViewRowType.Data) return;

            int indicador = Convert.ToInt32(e.GetValue("IND_EXTORNO"));

            if (indicador == 1)
            {
                e.Row.BackColor = System.Drawing.Color.LightCyan;
                e.Row.ForeColor = System.Drawing.Color.DarkRed;
            }

        }

        protected void grdMaestroOperacion_PageIndexChanged(object sender, EventArgs e)
        {
            int idD = Convert.ToInt32(Session["ID_DEPOSITO"]);
            List<TD_OPERACION_DEPOSITO_MAE> Lista = BL_CompensacionVehiculo.ListarDatosOperacionMae(idD);

            grdMaestroOperacion.DataSource = Lista;
            grdMaestroOperacion.DataBind();

        }

        protected void grdMaestroOperacion_PreRender(object sender, EventArgs e)
        {
            int idD = Convert.ToInt32(Session["ID_DEPOSITO"]);
            List<TD_OPERACION_DEPOSITO_MAE> Lista = BL_CompensacionVehiculo.ListarDatosOperacionMae(idD);

            grdMaestroOperacion.DataSource = Lista;
            grdMaestroOperacion.DataBind();
        }

        //protected void UsuariosCorreo()
        //{
        //    int idCab = Convert.ToInt32(ConfigurationManager.AppSettings["UsuarioCorreoCompensacion"]);

        //    grdUsuariosNotificar.DataSource = TablaDetLogic.ListarUsuariosCorreo(idCab);
        //    grdUsuariosNotificar.DataBind();


        //}

        protected void EnviarCorreo(int id)
        {
            int idCab = Convert.ToInt32(ConfigurationManager.AppSettings["UsuarioCorreoCompensacion"]);

            T_SEG_USUARIO usuarioCompesador = usu.listarUser(Session[DatosSesion.User].ToString())[0];

            string compensador = usuarioCompesador.DES_NOMBRE + " " + usuarioCompesador.DES_APELLIDOS;

            string Cliente = BL_CompensacionVehiculo.DesClienteCompensacion(id);

            List<TD_Facturas_Compensadas> ListaExtorno = BL_CompensacionVehiculo.FacturasExtornadas(id);

            string facturasExtornadas = string.Empty;

            for (int x = 0; x < ListaExtorno.Count; x++)
            {
                if (x == ListaExtorno.Count - 1)
                {
                    facturasExtornadas = facturasExtornadas + ListaExtorno[x].NUM_DOCUMENTO.ToString();
                }
                else
                {
                    facturasExtornadas = facturasExtornadas + ListaExtorno[x].NUM_DOCUMENTO.ToString() + ", ";
                }

            }

            List<string> ccUsuario = new List<string>();
            ccUsuario.Add(usuarioCompesador.DES_EMAIL);


            List<Td_Usuario_Correo> UsuariosCorreo = BL_CompensacionVehiculo.ListarUsuariosCorreo(idCab);

            List<string> correos = new List<string>();

            for (int i = 0; i < UsuariosCorreo.Count; i++)
            {

                string email = UsuariosCorreo[i].CORREO.ToString();

                correos.Add(email);

            }

            string body = "Se acaba de realizar el extorno de la compensacion de facturas para el cliente " + Cliente + ", por favor de no considerar al momento de imprimir.";
            string remitente = ConfigurationManager.AppSettings["MailFrom"];

            string mensaje = string.Format(HtmlEmail.HtmlNotificacionExtornoCompensacionVehiculos, body, facturasExtornadas, compensador);

            Crosland.Util.Util.SendEmail(correos, "Extorno de Compensacion - " + Cliente, mensaje, remitente, ccUsuario);



        }

        private void GuardarExceptionLog(String msgUsu, Exception ex, String metError)
        {
            try
            {
                String msgReal, fhError, pagError, codUsu;
                msgReal = (ex.InnerException != null) ? ex.InnerException.Message : ex.Message;
                pagError = new System.IO.FileInfo(Page.Request.Url.AbsolutePath).Name;
                codUsu = Session["User"].ToString();
                fhError = DateTime.Now.ToString("dd/MM/yyyy HH:mm:ss");

                System.Diagnostics.StackTrace trace = new System.Diagnostics.StackTrace(ex, true);
                int number = 0;
                for (int i = 0; i < trace.FrameCount; i++)
                {
                    System.Diagnostics.StackFrame sf = trace.GetFrame(i);
                    number = sf.GetFileLineNumber();
                }
                fhError = DateTime.Now.ToString("dd/MM/yyyy HH:mm:ss");
                new Crosland.Automotriz.Seguridad.ControlExeption.Logg().ErrorLog(Server.MapPath("~/Logs/ErrorLog.csv"), msgUsu, msgReal, pagError, metError, codUsu, number);
            }
            catch (DataException e)
            {

                MensajesError(e.Message, e, "GuardarExceptionLog");
            }
            catch (Crosland.Automotriz.Seguridad.ControlExeption.RunException re)
            {
                MensajesError(re.Message, re, "GuardarExceptionLog");
            }

        }

        private void MensajesError(String msgUsu, Exception ex, String metError)
        {
            Crosland.Automotriz.Web.UserControl.MensajeError uc = (Crosland.Automotriz.Web.UserControl.MensajeError)Master.FindControl("ucErrorMensaje");
            String msgReal, fhError, pagError, codUsu;
            msgReal = (ex.InnerException != null) ? ex.InnerException.Message : ex.Message;
            pagError = new System.IO.FileInfo(Page.Request.Url.AbsolutePath).Name;
            codUsu = Session["User"].ToString();
            fhError = DateTime.Now.ToString("dd/MM/yyyy HH:mm:ss");
            System.Diagnostics.StackTrace trace = new System.Diagnostics.StackTrace(ex, true);
            int number = 0;
            for (int i = 0; i < trace.FrameCount; i++)
            {
                System.Diagnostics.StackFrame sf = trace.GetFrame(i);
                number = sf.GetFileLineNumber();
            }
            uc.Errores(msgUsu, msgReal, fhError, pagError, metError, codUsu, number);
        }


    }
}